package one;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class JDBC_ORM {
	/**
	 * 实体类名要跟数据库表一直，区分大小写
	 */
	/**
	 * ORM框架,针对新增
	 * 通过反射使用对象实现自动实现，免sql语句。
	 * 参考sql-->insert into user(id,name,age) value(?,?,?)
	 * @param entity
	 * @param <T>
	 * @return
	 */
	public static <T> String ORM_INSERT(T entity){
		//并接增加的sql语句
		StringBuilder sqlInsert = new StringBuilder("insert into"+" ");
		//获取参数集合
		List<Object> parameters = new ArrayList<Object>();
		//通过反射获取实体类的class，进而获取其属性与方法
		Class<?> entityClass = entity.getClass();
		//获取class名
		String name = entityClass.getSimpleName();
		//并接，这里sql为--> insert into user (
		System.out.println(name);
		sqlInsert.append(name).append("(");
		//获取实体类中的属性
		Field[] fields = entityClass.getDeclaredFields();
		//获取每一个值，用逗号隔开
		if(fields!=null&&fields.length>0){
			for(int i=0;i<fields.length;i++){
				Field field = fields[i];
				//获取对应字值
				field.setAccessible(true);
				Object value = null;
				try {
					value = field.get(entity);
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				}
				if(value!=null){
					//这里sql形式为 --> insert into user(id,name,age,
					sqlInsert.append(field.getName()).append(",");
					//将参数放进集合
					System.out.println(value);
					parameters.add("'"+value+"'");
				}
			}
			//删除最后一个逗号,这里sql形式为 --> insert into user(id,name,age
			sqlInsert.deleteCharAt(sqlInsert.length()-1);
		}
		//这里sql形式为 --> insert into user(id,name,age)value(
        sqlInsert.append(")").append("value(");
		//并接多少个参数，这里sql形式为 --> insert into user(id,name,age)value(?,?,?,
		for (int i=0;i<parameters.size();i++){
//			sqlInsert.append("?,");
			sqlInsert.append(parameters.get(i)+",");
		}
		//去除最后一个逗号加上"）"，形式为--> insert into user(id,name,age)value(?,?,?)
        sqlInsert.deleteCharAt(sqlInsert.length()-1).append(")");
        String result = String.valueOf(sqlInsert);
		try {
			JdbcUtil.jdbcExecuteUpdate(result);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println(result);
		return result;
	}

	/**
	 * ORM框架,针对删除.数据库中的int字段一定要设为Integer。否则null当0处理
	 * 通过反射使用对象实现自动实现，免sql语句。
	 * 参考sql-->detete from user where id=? or user=?
	 * @param entity
	 * @param <T>
	 * @return
	 */
	public static <T> String ORM_DELETE(T entity){
		//并接增加的sql语句
		StringBuilder sqlDelete = new StringBuilder("delete from ");
		//获取参数集合
		List<Object> parameters = new ArrayList<Object>();
		//通过反射获取实体类的class，进而获取其属性与方法
		Class<?> entityClass = entity.getClass();
		//获取class名
		String name = entityClass.getSimpleName();
		//并接，这里sql为--> delete from user where
		sqlDelete.append(name).append(" where ");
		//获取实体类中的属性
		Field[] fields = entityClass.getDeclaredFields();
		//获取每一个值，用逗号隔开
		if(fields!=null&&fields.length>0){
			for(int i=0;i<fields.length;i++){
				Field field = fields[i];
				//获取对应字值
				field.setAccessible(true);
				Object value = null;
				try {
					value = field.get(entity);
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				}
				if(value!=null){
					//这里sql为--> delete from user where id=${value} or ...
					sqlDelete.append(field.getName()).append("=").append("'"+value+"'").append(" ").append("or ");
//					//将参数放进集合
//					parameters.add(value);
				}
			}
			//删除最后一个逗号,这里sql为--> delete from user where id=${value}
			sqlDelete.deleteCharAt(sqlDelete.length()-1);
			sqlDelete.deleteCharAt(sqlDelete.length()-1);
			sqlDelete.deleteCharAt(sqlDelete.length()-1);
		}
		String result = String.valueOf(sqlDelete);
		try {
			JdbcUtil.jdbcExecuteUpdate(result);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println(sqlDelete);
		return result;
	}

	/**
	 * ORM框架,针对修改.数据库中的int字段一定要设为Integer。否则null当0处理
	 * 通过反射使用对象实现自动实现，免sql语句。
	 * 参考sql-->update User set name=* where id=*
	 * @param entity
	 * @param <T>
	 * @return
	 */
	public static <T> String ORM_UPDATE(T entity,String...strings){
		//并接增加的sql语句
		StringBuilder sqlDelete = new StringBuilder("update ");
		//获取参数集合
		List<Object> parameters = new ArrayList<Object>();
		//通过反射获取实体类的class，进而获取其属性与方法
		Class<?> entityClass = entity.getClass();
		//获取class名
		String name = entityClass.getSimpleName();
		//并接，这里sql为--> update  user set
		sqlDelete.append(name).append(" set ");
		//获取实体类中的属性
		Field[] fields = entityClass.getDeclaredFields();
		//获取每一个值，用逗号隔开
		if(fields!=null&&fields.length>0){
			for(int i=0;i<fields.length;i++){
				Field field = fields[i];
				//获取对应字值
				field.setAccessible(true);
				Object value = null;
				try {
					value = field.get(entity);
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				}
				if(value!=null){
					//这里sql为--> update user set id=* , name=* ...
					sqlDelete.append(field.getName()).append("=").append("'"+value+"'").append(" ").append(", ");
//					//将参数放进集合
//					parameters.add(value);
				}
			}
			//删除最后一个逗号和空格
			sqlDelete.deleteCharAt(sqlDelete.length()-1);
			sqlDelete.deleteCharAt(sqlDelete.length()-1);
		}
		if(strings.length<2){
			return "错误，至少输入两个string值，一个为数据库字段值，一个为要参数。例：id=2";
		}
		for(int i=0;i<strings.length-1;i++){
			if(i!=0){
				i=i+1;
			}
			//这里sql为--> update user set id=* , name=* ... where id=*
			sqlDelete.append(" where "+strings[i]+"="+"'"+strings[i+1]+"'");
		}
		String result = String.valueOf(sqlDelete);
		try {
			JdbcUtil.jdbcExecuteUpdate(result);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println(sqlDelete);
		return result;
	}

	/**
	 * ORM框架,针对查询,没有参数默认全查询.返回一个set集合
	 * 通过反射使用对象实现自动实现，免sql语句。
	 * 参考sql-->select * from User where
	 * @param entity
	 * @param <T>
	 * @return
	 */
	public static <T> ResultSet ORM_QUERY(T entity, String... strings){
		ResultSet set = null;
		//并接增加的sql语句
		StringBuilder sqlSelect = new StringBuilder("select");
		//获取参数集合
		List<Object> parameters = new ArrayList<Object>();
		//通过反射获取实体类的class，进而获取其属性与方法
		Class<?> entityClass = entity.getClass();
		//获取class名
		String name = entityClass.getSimpleName();
		//并接，这里sql为--> select * from User
		sqlSelect.append(" * from ").append(name);
		if(strings.length==0){
			String result = String.valueOf(sqlSelect);
			System.out.println(result);
			try {
				set=JdbcUtil.jdbcExecuteQuery(result);
			} catch (Exception e) {
				e.printStackTrace();
			}
			return set;
		}else {
			sqlSelect.append(" where ");
			for(int i=0;i<strings.length-1;i++){
				if(i!=0){
					i=i+1;
				}
				//这里sql为--> select * from User where id=*
				sqlSelect.append(strings[i]+"="+"'"+strings[i+1]+"'"+" and ");
			}
			sqlSelect.deleteCharAt(sqlSelect.length()-1);
			sqlSelect.deleteCharAt(sqlSelect.length()-1);
			sqlSelect.deleteCharAt(sqlSelect.length()-1);
			sqlSelect.deleteCharAt(sqlSelect.length()-1);
			String result = String.valueOf(sqlSelect);
			System.out.println(result);
			try {
				set = JdbcUtil.jdbcExecuteQuery(result);
			} catch (Exception e) {
				e.printStackTrace();
			}
			return set;
		}
	}


}
